import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

///抽象abstract是面向对象中的一个非常重要的概念，通常用于描述父类拥有一种行为但无法给出细节实现，
///而需要通过子类来实现抽象的细节。这种情况下父类被定义为抽象类，子类继承父类后实现其中的抽象方法。
/// 同Java语言类似，Dart中的抽象类也使用abstract来实现，不过抽象函数无需使用abstract，直接给出定义不给出方法体实现即可
/// 抽象类中可以有数据，可以有常规函数，可以有抽象函数，但抽象类不能实例化。子类继承抽象类后必须实现其中的抽象函数。
class DartKeyWordsPage extends StatefulWidget {
  @override
  DartKeyWordsPageState createState() => new DartKeyWordsPageState();
}

class DartKeyWordsPageState extends State<DartKeyWordsPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(''),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    Son1 son1 = Son1();

    son1.doPrint();

    Son2 son2 = Son2();

    son2.doPrint();

    Son3 son3 = Son3();
    son3.doPrint();

    var p1 =  Person();
    var p2 =  Person();
    //可以看到Person类的num属性通过类进行控制，不能通过对象控制。，Dart语言中对于“静态”方式调用的约束和理解与Java相似
    Person.num = 10;
    p1.name = "赵四";
    Person.num = 20;
    p2.name = "刘能";
    p1.display();
    p2.display();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  @override
  void didUpdateWidget(DartKeyWordsPage oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
  }
}

abstract class First {//抽象类
  void doPrint() {//普通函数
    print('First');
  }
  void first();//抽象函数，实现类必须实现抽象函数
}
///Dart语言中没有接口（interface）的关键字，但是有实现（implements）关键字，
///Dart中可以将类（是否为抽象无关）当做隐式接口直接使用，当需要使用接口时，
///可以声明类来代替。
 class Second {
  void doPrint() {
    print('Second');
  }
}

class Father {
  void doPrint() {
    print('Father');
  }
}

class Son1 extends Father with First, Second {
  @override
  void first() {
    // TODO: implement first
  }
}

class Son2 extends Father with First implements Second {
  @override
  void first() {
    // TODO: implement first
  }
}

class Son3 extends Father with First implements Second {
  @override
  void doPrint() {
    print('Son');
  }

  @override
  void first() {
  }
}
class Person {
  static int num;
  String name;

  void display() {
    print("编号：$num, 名字：$name");
  }
}